#pragma once

#include "Gpu Thermal Settings.h"
#include "Enums.h"

using namespace System;

namespace StillDesign
{
	namespace NvApi
	{
		public ref class PhysicalGpu
		{
			private:
				NvPhysicalGpuHandle _physicalGpu;
				
			public:
				PhysicalGpu( NvPhysicalGpuHandle physicalGpu );
			
			public:
				//GpuThermalSettings^ GetThermalSettings();
				GpuThermalSettings^ GetThermalSettings( ThermalTarget sensorIndex );
				
//NVAPI_INTERFACE  NvAPI_GetLogicalGPUFromPhysicalGPU (NvPhysicalGpuHandle hPhysicalGPU, NvLogicalGpuHandle *pLogicalGPU) 
				property int AllOutputs
				{
					int get();
				}
				property int ConnectedOutputs
				{
					int get();
				}
				property int ConnectedSliOutputs
				{
					int get();
				}
				property int ConnectedOutputsWithLidState
				{
					int get();
				}
				property int ConnectedSliOutputsWithLidState
				{
					int get();
				}
				property StillDesign::NvApi::SystemType SystemType
				{
					StillDesign::NvApi::SystemType get();
				}
				property int ActiveOutputs
				{
					int get();
				}
				//NvAPI_GPU_EDID (NvPhysicalGpuHandle hPhysicalGpu, NvU32 displayOutputId, NV_EDID *pEDID) 
//NVAPI_INTERFACE  NvAPI_GPU_OutputType (NvPhysicalGpuHandle hPhysicalGpu, NvU32 outputId, NV_GPU_OUTPUT_TYPE *pOutputType) 
//NVAPI_INTERFACE  NvAPI_GPU_ValidateOutputCombination (NvPhysicalGpuHandle hPhysicalGpu, NvU32 outputsMask) 
				property String^ FullName
				{
					String^ get();
				}
//NVAPI_INTERFACE  NvAPI_GPU_PCIIdentifiers (NvPhysicalGpuHandle hPhysicalGpu, NvU32 *pDeviceId, NvU32 *pSubSystemId, NvU32 *pRevisionId, NvU32 *pExtDeviceId) 
				property StillDesign::NvApi::GpuType GpuType
				{
					StillDesign::NvApi::GpuType get();
				}
				property GpuBusType BusType
				{
					GpuBusType get();
				}
				property int BusId
				{
					int get();
				}
				property int BusSlotId
				{
					int get();
				}
				property int IRQ
				{
					int get();
				}
				property int VBiosRevision
				{
					int get();
				}
				property int VBiosOemRevision
				{
					int get();
				}
				property String^ VBiosVersionString
				{
					String^ get();
				}
				property int AgpAperture
				{
					int get();
				}
				property int CurrentAgpRate
				{
					int get();
				}
				property int CurrentPcieDownstreamWidth
				{
					int get();
				}
				property int PhysicalFrameBufferSize
				{
					int get();
				}
				property int VirtualFrameBufferSize
				{
					int get();
				}
				
			internal:
				property NvPhysicalGpuHandle Handle
				{
					NvPhysicalGpuHandle get();
				}
		};
	};
};